package com.work.handle;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @ClassName CglibProxy
 * @Description cglib代理
 * @Author Administrator
 * @Date 2019/3/6 0006 23:26:02
 * @Version 1.0.0
 **/
public class CglibProxy implements MethodInterceptor {
    /**
     * 使用CGLib使用动态代理，完全不受代理类必须实现接口的限制，而且CGLib底层采用
     * ASM字节码生成的框架，使用字节码技术生成代理类，比使用java 反射效率要高一些，
     * CGLib不能对声明为fianl的方法进行代理，因为CGLib原理是动态生成被代理的子类
     */
    private Enhancer  enHancer = new Enhancer();
   //Enhancer类是CGLib中的一个字节码增强器，它可以方便的对你想要处理的类进行扩展
    public Object getProxy(Class clazz){
        enHancer.setSuperclass(clazz);
        enHancer.setCallback(this);
        return enHancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("**************拦截之前******************");
        Object o1 = methodProxy.invokeSuper(o, objects);
        System.out.println("**************拦截之后******************");

        return o1;

    }
}
